//#ifndef Field_H
//#define Field_H
//
//#include <vector>
//#include <string>
//#include <iostream>
//#include <map>
//
//#include <hdf5.h>
//
//#include "Config/Config.h"
//#include "Mesh/Mesh.h"
//
//using namespace std;
//
//struct FemVector2D
//{
//    double x[2];
//
//    void operator *=(const double &value)
//    {
//        x[0] *= value;
//        x[1] *= value;
//    }
//};
//
//struct FemVector3D
//{
//    double x[3];
//
//    void operator =(const double& value)
//    {
//        x[0] = value;
//        x[1] = value;
//        x[2] = value;
//    }
//
//    void operator +=(const double& value)
//    {
//        x[0] += value;
//        x[1] += value;
//        x[2] += value;
//    }
//
//    void operator +=(const FemVector3D& vector3d)
//    {
//        x[0] += vector3d.x[0];
//        x[1] += vector3d.x[1];
//        x[2] += vector3d.x[1];
//    }
//
//    void operator *=(const double& value)
//    {
//        x[0] *= value;
//        x[1] *= value;
//        x[2] *= value;
//    }
//
//    void operator /=(const double& value)
//    {
//        x[0] /= value;
//        x[1] /= value;
//        x[2] /= value;
//    }
//
//    void setZero()
//    {
//        x[0] = 0.0;
//        x[1] = 0.0;
//        x[2] = 0.0;
//    }
//
//    double getSquare()
//    {
//        return x[0] * x[0] + x[1] * x[1] + x[2] * x[2];
//    }
//
//
//};
//
//template<class Type>
//class Field
//{
//
//public:
//
//    Field(string name_, Config* config_, ParallelMPI* pmpi_, Space *space_);
//
//    Field(EasyMesh::ParallelMesh* mesh_);
//
//    ~Field();
//
//    inline int size() const
//    {
//        return data.size();
//    }
//
//    void resize(int n)
//    {
//        return data.resize(n);
//    }
//
//    void set_value(const Type& value)
//    {
//        for(int i = 0; i < data.size(); i++)
//        {
//            data[i] = value;
//        }
//    }
//
//    void setZero()
//    {
//        for (int i = 0; i < data.size(); i++)
//        {
//            data[i] = 0.0;
//        }
//    }
//
//    void setData(Type* dataIn);
//
//    Type getValue(int iVolume, const EasyMesh::Point& point);
//
//    void multiply(const double& value)
//    {
//        for(int i = 0; i < data.size(); i++)
//        {
//            data[i] *= value;
//        }
//    }
//
//    inline Type& operator () (int i)
//    {
//        return data[i];
//    };
//
//    inline Type operator () (int i) const
//    {
//        return data[i];
//    };
//
//    void operator=(const Field<Type>& field)
//    {
//        data.resize(field.size());
//        for(int i = 0; i < size(); i++)
//        {
//            data[i] = field.data[i];
//        }
//    }
//
//    static bool greater_sort_fbc(FieldBoundaryConditionParameter& fbc_param1, FieldBoundaryConditionParameter& fbc_param2)
//    {
//        return (fbc_param1.fbc_name < fbc_param2.fbc_name);
//    }
//
//    string get_field_boundary_type(string edge_name)
//    {
//
//        auto iter = fbc_param.find(edge_name);
//        if(iter != fbc_param.end())
//        {
//            return fbc_param[edge_name]->fbc_type;
//        }
//        else
//        {
//            return "none";
//        }
//    }
//
//    void cal_average_field();
//
//    void cal_global_field();
//
//    //计算标量场的梯度，结果为矢量场
//    void calGrad(Field<FemVector3D>* vectorField);
//
//    //计算矢量场的散度，结果为标量场
//    void calDivergence(Field<double>* scalarField);
//
//    //计算矢量场的散度，结果为标量场，只计算volumeGroup中的单元（主要是介质内部）
//    void calDivergenceInVolumeGroup(Field<double>* scalarField);
//
//    Field<Type>* get_cell_field();
//
//    string name;
//
//    Config* config;
//
//    ParallelMPI* pmpi;
//
//    EasyMesh::ParallelMesh* mesh;
//
//    EasyMesh::Mesh* globalMesh;
//
//    Space* space;
//
//    map<string, FieldBoundaryConditionParameter*> fbc_param;
//
//    vector<Type> data;
//
//    //data globalֻ����ƽ��ֵ��������˲ʱֵ
//    vector<Type> data_global;
//    vector<Type> data_global_temp;
//
//    //now data_average is only used in IO module, for figure plot 
//    vector<Type> data_average;
//    vector<Type> data_average_global;
//
//    //cell_field will be used in collision module
//    Field<Type>*  cell_field;
//
//    bool is_cal_global;
//
//    bool is_cal_average;
//
//    //cal_sharepointAllReduce(); ��ÿ������data�е�share����� �������й�Լ��Ӵ���
//    void cal_sharepointAllReduce();
//
//    //cal_sharepointEHWeightedAverage() ��ÿ������data�е�share����� ʸ����ƽ������
//    void cal_sharepointEHWeightedAverage();
//
//    void cal_sharepointEHWeightedSum();
//
//    double* every_sharepoint1;  //������������ ���ڴ��sharepoint��ֵ�����ڹ�Լ�����ֵ��ÿ������
//    double* sum_sharepoint1;
//
//    Field<double>* number_field;
//
//private:
//
//};
//
//#endif
